<--- %%NOBANNER%% --> mn2_pr.sas
 BackForward

/*------------------<--  Start of Description -->--------------------\
| Power for two independent means;                                   |
|--------------------<--  End of Description -->---------------------|
|--------------------------------------------------------------------|
|--------------<--  Start of Files or Arguments Needed -->-----------|
| Arguments:                                                         |
|   - Required:                                                      |
|     std = pooled standard deviation                                |
|     n1,n2 = sample sizes for groups 1 and 2 respectively           |
|     y1 = true group 1 mean under null hypothesis                   |
|     min_y2 = smallest possible true group 2 mean                   |
|   - Optional:                                                      |
|     max_y2 = largest possible true mean for group 2                |
|     inc_y2 = increment value for range of y2                       |
|     alpha = type 1 error, e.g. .01 or .05, default=.05             |
|     sides = 1 or 2 for 1 or 2 sided test, default=2                |
|     plot  = 'P' for line printer plot of power vs y2               |
|             'G' for SAS/GRAPH plot of power vs y2                  |
|     unit  = units for mean, e.g. mg, lbs., cm, etc.                |
| Output: Power for true group 1 mean of y1 vs true group 2 means    |
|         ranging from min_y2 to max_y2                              |
|---------------<--  End of Files or Arguments Needed -->------------|
|--------------------------------------------------------------------|
|----------------<--  Start of Example and Usage -->-----------------|
| Example: %mn2_pr(alpha=.05,sides=1,y1=0,min_y2=.2,max_y2=1,        |
|                  inc_y2=.1,std=1, n1=51,n2=51,unit=gals,plot=p);   |
| Usage:   %mn2_pr(ALPHA=.05,SIDES=2,N1=.,N2=.,Y1=.,MIN_Y2=.,        |
|              MAX_Y2=.,INC_Y2=.,STD=.,PLOT= , UNIT=);               |
| Reference: Bergstralh, EJ.  SAS macros for sample size and power   |
|            calculations.  Proceedings of the 9th annual SAS Users  |
|            Group International Conference.                         |
|            Equation #8.                                            |
\-------------------<--  End of Example and Usage -->---------------*/
%MACRO  mn2_pr(ALPHA=.05,SIDES=2,N1=.,N2=.,Y1=.,MIN_Y2=.,
               MAX_Y2=.,INC_Y2=.,STD=.,PLOT= , UNIT=);
/*--------------------------------------------\
| Author:   Michael Riggs and Eric Bergstralh;|
| Created:  November 16, 1992;                |
| Modified: January 9, 1998;                  |
| Purpose:  Power for two independent means;  |
\--------------------------------------------*/
 OPTIONS MISSING=' ' NOCENTER;
   %LET PLOT=%UPCASE(&PLOT);
 DATA T1;
      ALPHA=&ALPHA;
      SIDES=&SIDES;
      Y1=&Y1;
      MIN_Y2=&MIN_Y2;
      MAX_Y2=&MAX_Y2;
      INC_Y2=&INC_Y2;
      N1=&N1;
      N2=&N2;
      STD=&STD;
    ZALPHA=(PROBIT(1-ALPHA))*(SIDES=1) + (PROBIT(1-ALPHA/2))*(SIDES=2);
    N=N1+N2;
    IF MAX_Y2=. THEN DO;
      MAX_Y2=MIN_Y2+1; INC_Y2=MIN_Y2+2;  *NEED 1 EXEC OF DO;
    END;
    TN1=N1;
    TN2=N2;
    df=tn1+tn2-2; 
    tn1=int( tn1*(df+1)/(df+3) );  *decrease n for t-test 1/9/98;    
    tn2=int( tn2*(df+1)/(df+3) );  *decrease n for t-test;    

    TY1=Y1;
    TSTD=STD;
    DO Y2=MIN_Y2 TO MAX_Y2 BY INC_Y2;
       ZBETA=ABS(Y2-TY1)/(TSTD*SQRT(1/TN1+1/TN2))-ZALPHA;
       POWER=PROBNORM(ZBETA);
       OUTPUT;
     END;
 LABEL Y1="Group 1*Mean (&unit)"
       Y2="Group 2*Mean (&unit)"
       N1='Group 1*Sample size'
       N2='Group 2*Sample size';
FOOTNOTE1 '   ';
 run;
 PROC PRINT SPLIT='*';
  ID Y1; var  Y2 POWER;

 TITLE2
   "POWER ESTIMATES FOR COMPARING TWO MEANS";
 title3
 "Alpha=&alpha, Sides=&sides, Pooled SD=&std, N1=&n1, N2=&n2";
 title4"Group 1 true mean=&y1(&unit)";
%IF "&MAX_Y2" NE "" %THEN %DO;
    %IF &PLOT= P  %THEN %DO;
      PROC PLOT NOLEGEND;
           PLOT POWER*Y2/ VAXIS=0 TO 1.0 BY .10
                          HAXIS=&MIN_Y2 TO &MAX_Y2 BY &INC_Y2;
      LABEL Y2="True Group 2 mean(&unit)";
    %END;
    %ELSE %IF &PLOT= G  %THEN %DO;
          PROC GPLOT ;
      PLOT POWER*Y2/ vaxis=0 to 1.0 by .2;
      SYMBOL1  Font= v=none i=join l=1;
      LABEL Y2="True Group 2 mean(&unit)";
   run;
    %END;
    RUN;
%END;
%MEND mn2_pr;